package algorithm_learn.sort;

public class Code_bubbleSort {
    public static void main(String[] args) {
        int maxlen = 50;
        int maxvalue = 1000;
        int testTime = 10000;
        for(int i =0;i<testTime;i++){
            System.out.println("===================================");
            int[] arr1 = lenRandomValueRandom(maxlen,maxvalue);
            System.out.println("arr1:");
            printArr(arr1);
            int[] arr2 = copyArray(arr1);

            System.out.println("arr2:");
            printArr(arr2);

            Code_selectSort.selectSort(arr2);
            bobbleSort(arr1);

            if(equalValue(arr1,arr2)){
                System.out.println("第"+i+"次测试通过！");
            }
            else {
                System.out.println("==============");
                System.out.println("出错了！");
                System.out.println("==============");
                printArr(arr1);
                printArr(arr2);
                break;
            }
        }

    }
    //拷贝函数 复制一份一模一样的函数
    public static int[] copyArray(int[] arr){
        int[] ans = new int[arr.length];
        for(int i = 0;i<arr.length;i++){
            ans[i] = arr[i];
        }
        return ans;
    }

    //验证两个数组是不是相同
    public static boolean equalValue(int[] arr1,int[] arr2){
        for(int i = 0;i<arr1.length;i++){
            if(arr1[i] != arr2[i]) return false;
        }
        return true;
    }

    public static void printArr(int[] arr){
        for (int i = 0;i<arr.length;i++){
            System.out.print(arr[i] + " ");
        }
        System.out.println("");
    }
    //冒泡排序
    public static void bobbleSort(int[] arr){
        //边界情况
        if(arr == null || arr.length < 2){
            return;
        }
        //0 - n-1 end
        //0 - n-2
        //0 - n-3
        //0 - n-i
        int N = arr.length;
        //end 表示冒泡区间
        for (int end = N-1;end>=0;end--){
             //0-end 干事情
            //0 1 | 1 2 | 2 3 | 3 4
            for(int second = 1;second<=end;second++){
                //如果第二个数 小于 第一个数就要交换
                if(arr[second-1]>arr[second]){
                    swap(arr,second-1,second);
                }
            }
        }
    }
    public static void swap(int[] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    //使用对数器来进行代码测试
    //返回arr length在[0，maxLen-1] value[0，maxValue-1]
    public static int[] lenRandomValueRandom(int maxLen,int maxValue){
        //length在[0，maxLen-1]
        int len = (int)(Math.random() * maxLen);
        int[] ans = new int[len];
        for(int i = 0;i<len;i++){
            ans[i] = (int)(Math.random() * maxValue);
        }
        return ans;
    }
}
